package com.qingcheng.controller;

import com.alibaba.dubbo.config.annotation.Reference;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.qingcheng.pojo.goods.Goods;
import com.qingcheng.pojo.goods.Sku;
import com.qingcheng.pojo.goods.Spu;
import com.qingcheng.service.goods.CategoryService;
import com.qingcheng.service.goods.SpuService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.thymeleaf.TemplateEngine;
import org.thymeleaf.context.Context;

import javax.swing.text.StyledEditorKit;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @Author: LDeng
 * @Date: 2020-04-29 9:05
 */

@RestController
@RequestMapping("/item")
public class ItemController {

    @Reference
    private SpuService spuService;

    @Reference
    private CategoryService categoryService;

    //生成文件的路径， 由于开发环境和生产环境不一样（windows/linux）
    // 这里需要通过配置文件读取，
    @Value("${pagePath}")
    private String pagePath;

    //引入模板引擎， applicatonContex里面配置的bean
    @Autowired
    private TemplateEngine templateEngine;

    //批量生成spuid下面的所有的sku页面
    @GetMapping("/createPage")
    public void createPage(String spuId){
        //1 查询商品信息
        Goods goods = spuService.findGoodsById(spuId);
        //获取spu信息
        Spu spu = goods.getSpu();
        //获取sku列表
        List<Sku> skuList = goods.getSkuList();

        //查询商品分类
        List<String> categoryList=new ArrayList<>();
        categoryList.add(categoryService.findById(spu.getCategory1Id()).getName());//一级分类名称
        categoryList.add(categoryService.findById(spu.getCategory2Id()).getName());//二级分类名称
        categoryList.add(categoryService.findById(spu.getCategory3Id()).getName());//三级分类名称

        //构建sku地址列表
        Map<String,String> urlMap=new HashMap<>();
        for (Sku sku : skuList) {
            if("1".equals(sku.getStatus())){
                String specJson = JSON.toJSONString(JSON.parseObject(sku.getSpec()), SerializerFeature.MapSortField);
                urlMap.put(specJson,sku.getId()+".html");
            }


        }


        //2 批量生成sku页面
        for (Sku sku : skuList) {
            //1> 创建上下文和数据模型
            Context context=new Context();
            Map<String,Object> dataModel=new HashMap<>();
            dataModel.put("spu",spu);
            dataModel.put("sku",sku);
            dataModel.put("categoryList",categoryList);
            dataModel.put("skuImages",sku.getImages().split(","));//sku图片列表
            dataModel.put("spuImages",spu.getImages().split(","));//spu图片列表

            //参数列表， JSON转MAP
            Map paramItems=JSON.parseObject(spu.getParaItems());
            dataModel.put("paraItems",paramItems);
            //规格列表
            Map<String,String> specItems =(Map)JSON.parseObject(sku.getSpec());
            dataModel.put("specItems",specItems);
            //{"颜色":["红","绿"],"机身内存":["8G+64G","8G+128g"]}原数据格式转成想要的数据格式
            //{"颜色":[{'option':'红',checked:true},{'option':'绿',checked:false}],"机身内存":["8G+64G","8G+128g"]}
            //规格选项数据
            Map<String,List> specMap =(Map)JSON.parseObject(spu.getSpecItems());
            for (String key : specMap.keySet()) {//循环规格
                List<String> list = specMap.get(key);//
                List<Map> mapList=new ArrayList<>();//构建新的集合{"颜色":[{'option':'红',checked:true},{'option':'绿',checked:false}]
                    //循环规格选项
                for (String value : list) {
                    Map map=new HashMap();
                    map.put("option",value);
                    if(specItems.get(key).equals(value)){
                        map.put("checked",true);//如果和当前的sku相同就是选中
                    }else{
                        map.put("checked",false);//
                    }
                    //当前sku组合
                    Map<String,String> spec=(Map)JSON.parseObject(sku.getSpec());
                    spec.put(key,value);
                    String specJson = JSON.toJSONString(spec, SerializerFeature.MapSortField);//MapSortFile排序

                    map.put("url",urlMap.get(specJson));
                    mapList.add(map);
                }
                specMap.put(key,mapList);//用新的集合替换原有的集合
            }


            dataModel.put("specMap",specMap);

            context.setVariables(dataModel);
            //2> 准备文件
            File dir=new File(pagePath);
            if(!dir.exists()){//如果目录不存在就创建
                dir.mkdirs();
            }
            File dest=new File(dir,sku.getId()+".html");
            try {
                PrintWriter writer=new PrintWriter(dest,"UTF-8");
                templateEngine.process("item",context,writer);
                System.out.println("debug======>生成页面"+sku.getId()+".html");
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }

            //3> 生成页面

        }


    }

}
